package org.qianji.goosql.table;

import java.util.List;
import java.util.Map;

/**
 * 别名表，指定别名的表。
 * 
 * @author gmz
 * 
 */
public class AliasTable extends AbstractTable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -7654918646386843336L;

	private Table queryTable;
	private String tableAlias;

	/**
	 * 根据表和别名构造别名表。
	 * 
	 * @param queryTable
	 *            {@link Table Table} 表
	 * @param tableAlias
	 *            {@link java.lang.String String} 别名
	 */
	public AliasTable(Table queryTable, String tableAlias) {
		super();
		if (queryTable == null || tableAlias == null || tableAlias.isEmpty()) {
			throw new NullPointerException("args can't be null");
		}
		this.queryTable = queryTable;
		this.tableAlias = tableAlias;
	}

	/**
	 * 获取表。
	 * 
	 * @return {@link Table Table} 表
	 */
	public Table getQueryTable() {
		return queryTable;
	}

	/**
	 * 获取别名。
	 * 
	 * @return {@link java.lang.String String} 别名
	 */
	public String getTableAlias() {
		return tableAlias;
	}

	@Override
	public String getTable() {
		return queryTable.getTable();
	}

	@Override
	public String getTableName() {
		return tableAlias;
	}

	@Override
	public String toSql() {
		StringBuffer tab = new StringBuffer(queryTable.getTable()).append(" ").append(tableAlias);
		return tab.toString();
	}

	@Override
	public List<Object> getPlacedParameters() {
		return queryTable.getPlacedParameters();
	}

	@Override
	public Map<String, Object> getNamedParameters() {
		return queryTable.getNamedParameters();
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null || !(obj instanceof AliasTable)) {
			return false;
		}
		AliasTable other = (AliasTable) obj;
		if (queryTable.getTable().equals(other.getTable()) && tableAlias.equals(other.getTableAlias())) {
			return true;
		}
		return false;
	}

	@Override
	public int hashCode() {
		int hc = 17;
		hc = 37 * hc + queryTable.getTable().hashCode();
		hc = 37 * hc + tableAlias.hashCode();
		return hc;
	}

	@Override
	public String toString() {
		return toSql();
	}

}
